package com.trkj.service;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.trkj.dao.EmpDAO;
import com.trkj.pojo.Emp;
import com.trkj.vo.BackLogProcessVo;

@Service
@Transactional
public class OriginalProcessService {

	@Autowired
	private RepositoryService repositoryService;
	@Autowired
	private RuntimeService runtimeService;
	@Autowired
	private TaskService taskService;
	@Autowired
	private FormService formService;
	@Autowired
	private HistoryService historyService;
	@Autowired
	WorkFlowService workFlowService;
	@Autowired
	EmpDAO empDAO;

	public List<BackLogProcessVo> findMyPersonalTask(String processID, String processType, String name,
			List<HistoricTaskInstance> tasks) {
		// 新建一个集合，用于存放vo对象
		List<BackLogProcessVo> list = new ArrayList<>();
		for (HistoricTaskInstance task : tasks) {
			BackLogProcessVo bpv = new BackLogProcessVo();
			HistoricVariableInstance hvi = historyService.createHistoricVariableInstanceQuery()
					.processInstanceId(task.getProcessInstanceId()).variableName("processid").singleResult();
			// 查询流程变量的processid的属性值
			bpv.setProcessId(String.valueOf(hvi.getValue()));
			// 通过任务（task）获取的流程定义id（ProcessDefinitionId）查询一个流程定义对象（processDefinition）
			ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
					.processDefinitionId(task.getProcessDefinitionId()).singleResult();
			// 通过流程定义对象（processDefinition）查询部署对象
			Deployment deployment = repositoryService.createDeploymentQuery()
					.processDefinitionKey(processDefinition.getKey())
					.orderByDeploymenTime().desc().list().get(0);
			// 通过部署对象设置vo的流程类型
			bpv.setProcessName(deployment.getName());
			// 通过任务获取的流程实例编号和usertask1查询一个历史任务实例，用于获取流程发起人的id
			HistoricTaskInstance histask = historyService.createHistoricTaskInstanceQuery()
					.processInstanceId(task.getProcessInstanceId()).taskDefinitionKey("usertask1").singleResult();
			// 获得流程发起人
			Emp luncher = empDAO.findOne(Integer.valueOf(histask.getAssignee()));
			// 设置流程发起人
			bpv.setLaunchPeople(luncher.getEmpName());
			// 格式化时间对象
			SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd");
			// 流程发起时间
			bpv.setLaunchTime(sm.format(histask.getStartTime()));
			// 任务名称
			HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery()
					.processInstanceId(task.getProcessInstanceId()).singleResult();
			String taskname = "";
			if (hpi.getEndTime() != null) {
				taskname = "结束";
			} else {
				Task task2 = taskService.createTaskQuery().processInstanceId(hpi.getId()).singleResult();
				taskname = task2.getName();

			}
			bpv.setTaskName(taskname);
			// 任务开始时间
			bpv.setStartTime(sm.format(task.getCreateTime()));
			// 任务编号
			bpv.setTaskId(task.getId());
			// 所有条件不为空
			if (processID != null && processID.length() > 0 && processType != null && processType.length() > 0
					&& name != null && name.length() > 0) {
				if (bpv.getProcessId().indexOf(processID) >= 0 && bpv.getProcessName().indexOf(processType) >= 0
						&& bpv.getLaunchPeople().indexOf(name) >= 0) {
					list.add(bpv);
				}
				// processID 和 processType 不为空
			} else if (processID != null && processID.length() > 0 && processType != null && processType.length() > 0) {
				if (bpv.getProcessId().indexOf(processID) >= 0 && bpv.getProcessName().indexOf(processType) >= 0) {
					list.add(bpv);
				}
				// processID 和 name 不为空
			} else if (processID != null && processID.length() > 0 && name != null && name.length() > 0) {
				if (bpv.getProcessId().indexOf(processID) >= 0 && bpv.getLaunchPeople().indexOf(name) >= 0) {
					list.add(bpv);
				}
				// processType 和 name 不为空
			} else if (processType != null && processType.length() > 0 && name != null && name.length() > 0) {
				if (bpv.getProcessName().indexOf(processType) >= 0 && bpv.getLaunchPeople().indexOf(name) >= 0) {
					list.add(bpv);
				}
				// processType 不为空
			} else if (processType != null && processType.length() > 0) {
				if (bpv.getProcessName().indexOf(processType) >= 0) {
					list.add(bpv);
				}
				// processID 不为空
			} else if (processID != null && processID.length() > 0) {
				if (bpv.getProcessId().indexOf(processID) >= 0) {
					list.add(bpv);
				}
				// name 不为空
			} else if (name != null && name.length() > 0) {
				if (bpv.getLaunchPeople().indexOf(name) >= 0) {
					list.add(bpv);
				}
			} else {
				list.add(bpv);
			}
		}
		return list;
	}

	/**
	 * 封装datagrid要的map对象到jsp页面
	 * 
	 * @author Lixd
	 * @param useid
	 *            用户id，用于查询该用户的数据
	 * @param processID
	 *            条件：流程编号
	 * @param processType
	 *            条件：流程类型
	 * @param name
	 *            条件：流程发起人
	 * @param page
	 *            条件：当前页
	 * @param rows
	 *            条件：页大小
	 * @return Map<String, Object> datagrid要的map对象，封装了总记录数和当前页的数据
	 */
	public Map<String, Object> getPageOriginal(Integer useid, String processID, String processType, String name,
			Integer page, Integer rows) {
		Map<String, Object> map = new HashMap<>();
		if (page != null && page > 0 && rows != null && rows > 0) {
			// 查询没分页的所有集合
			List<HistoricTaskInstance> tasks = workFlowService.findMyOriginalProcess(useid);
			// 没分页经过条件过滤的集合，用于获取总记录数
			List<BackLogProcessVo> list = findMyPersonalTask(processID, processType, name, tasks);
			// 通过map集合去除processInstanceId重复的值
			Map<String, BackLogProcessVo> map2 = new HashMap<>();
			for (BackLogProcessVo bpv : list) {
				String processInstanceId = workFlowService.getProcessInstanceIdByTaskId(bpv.getTaskId());
				map2.put(processInstanceId, bpv);
			}
			List<BackLogProcessVo> newlist = new ArrayList<>();
			newlist.addAll(map2.values());
			// 分页后的集合
			List<BackLogProcessVo> list2 = new ArrayList<>();
			Collections.sort(newlist);
			int i = (page - 1) * rows;// 起始下标
			int a = (page - 1) * rows;// 游动下标
			while (a - i < rows) {// 控制循环次数，固定为rows次
				if (a <= newlist.size() - 1) {// 防止最后一页时数组越界
					list2.add(newlist.get(a));// 在集合中加入当前页的数据
					a++;// 游动下标自加
				} else {
					break;// 最后一页，下标将越界时，退出循环
				}
			}
			map.put("total", newlist.size());
			map.put("rows", list2);
		}
		return map;
	}
}
